#!/usr/bin/python3
# encoding:utf-8

# API接口服务端-商城
# 验证票据票号 api
# 在 python 3.10.5 测试通过 
 
# pip install flask 
# pip install flask-cors
# pip install pillow

import base64
import time
import json
import flask
import os
import random

# from flask_cors import *
from flask_cors import CORS
from flask import send_file

#产生验证码图片
from flask import render_template
from PIL import Image, ImageDraw, ImageFont, ImageFilter 
from io import BytesIO
 

# 实例化api，把当前这个python文件当作一个服务，__name__代表当前这个python文件
api = flask.Flask(__name__)

#添加跨域请求允许的头部字段
# 对当前这个flask 核心对象app添加access-control-origin的头部字段
# 对/下所有的url 允许所有的origins来访问
CORS(api, supports_credentials=True)


#验证码图片
def validate_picture():
    total = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345789'
    # 图片大小130 x 50
    width = 130
    heighth = 50
    # 先生成一个新图片对象
    im = Image.new('RGB',(width, heighth), 'white')
    # 设置字体
    font = ImageFont.truetype("Arial.ttf", 30)
    # 创建draw对象
    draw = ImageDraw.Draw(im)
    str = ''
    # 输出每一个文字
    for item in range(4):
        text = random.choice(total)
        str += text
        draw.text((-3+random.randint(3,7)+25*item, -3+random.randint(2,7)), text=text, fill='black',font=font )

    # 划几根干扰线
    for num in range(1):
        x1 = random.randint(0, width/2)
        y1 = random.randint(0, heighth/2)
        x2 = random.randint(0, width)
        y2 = random.randint(heighth/2, heighth)
        draw.line(((x1, y1),(x2,y2)), fill='black', width=1)

    # 加上滤镜
    im = im.filter(ImageFilter.FIND_EDGES)
    return im, str

#生成验证码实例的函数
def run_code():
    #生成验证码，image为验证码图片，code为验证码文本
    image, code = validate_picture()
    
    # 将验证码图片以二进制形式写入在内存中，防止将图片都放在文件夹中，占用大量磁盘
    buf = BytesIO()
    image.save(buf, 'jpeg')
    buf_str = buf.getvalue()    
    
    data = str(base64.b64encode(buf_str))[1:].strip("'")    #将验证码转换为base64格式
    # session['code'] = code  #将验证码文本存入session，做用户登录认证时可用
    return data    
   

# -----------------------------------------  # -------------- # 接口定义 # ----- 
@api.route('/')
def test():
    data = run_code()   #生成新验证码   
    return render_template('test.html', img_stream = data)  
    

#调用验证码图片生成接口
@api.route('/captchaImage')
def captchaImage():
    data = run_code()   #生成新验证码
    # src="data:;base64,{{ data }}"
    # return data 
    # return render_template('test.html', img_stream = data)  
    ren = {'code':200 ,'msg':'成功' , 'img': data }
    return json.dumps(ren,ensure_ascii=False)
    
# post入参访问方式三：josn格式参数  
@api.route('/login',methods=['post'])
def login():
  #from-data格式参数
  username = flask.request.json.get('username')
  password = flask.request.json.get('password')
  code = flask.request.json.get('code')  
  uuid = flask.request.json.get('uuid')
  
  # 参数不能为空
  if username and password and code :  
    ren = {'code':200 ,'msg':'成功' ,'token':'20221019' ,'name':'ares' }
  else:
    ren = {'code':1001 ,'msg':'缺少必要的参数' }
  return json.dumps(ren,ensure_ascii=False)
  
 # post入参访问方式三：josn格式参数  
@api.route('/logout',methods=['post'])
def logout():
  ren = {'code':200 ,'msg':'成功' } 
  return json.dumps(ren,ensure_ascii=False) 
  
# get访问
@api.route('/getInfo',methods=['get'])
def getInfo(): 
  ren = {'code':200 ,'msg':'成功' } 
  return json.dumps(ren,ensure_ascii=False)   
  
# get访问 用户个人信息
@api.route('/system/user/profile',methods=['get'])
def getProfile(): 
  ren = {'code':200 ,'msg':'成功' } 
  return json.dumps(ren,ensure_ascii=False)     
  
# get访问 用户个人头像
@api.route('/system/user/profile/avatar',methods=['get'])
def getAvatar(): 
  ren = {'code':200 ,'msg':'成功' } 
  return json.dumps(ren,ensure_ascii=False)     
 
 
  

# ########## ------------------- ############## -- 交易所 -----------  
# 服务端主程序入口  
if __name__ == '__main__':
  api.run(port=8888,debug=True,host='127.0.0.1') # 启动服务
  # debug=True,改了代码后，不用重启，它会自动重启
  # 'host='127.0.0.1' 别IP访问地址